#include "IR.h"
#include "timer.h"
#include <STRING.H>

u8 IR_data[6];
u8 IRNumBitCnt;          // 接收位数据的个数,数据
u8 start_flag = 0;       // 检测到码头 start_flag 置 1,反之置 0
u8 Jump_flag;            // 记录上一次电平，作为电平跳变判断
u16 LowCount, HighCount; // 电平时间计数

u8 IR_ACCEPT_DONE_FLAG = 0;

/***********************************************************
 * description: 接收码计数函数,100us调用一次
 * param {*}
 * return {*}
 ***********************************************************/
void IR_ReadCount(void)
{
    if (IR_READ_PORT == 0)
    {
        if (Jump_flag)
        {
            Jump_flag = 0;
            IR_ReadDecode(); // 跳变到低电平则解码数据
            LowCount = 0;    // 计数清零
            HighCount = 0;   // 计数清零
        }
        LowCount++;
    }
    else if (IR_READ_PORT == 1)
    {
        if (!Jump_flag)
        {
            Jump_flag = 1;
            LowCount = 0;  // 计数清零
            HighCount = 0; // 计数清零
        }
        HighCount++;
    }
}

/***********************************************************
 * description: 接收码解码函数
 * param {*}
 * return {*}
 ***********************************************************/
void IR_ReadDecode(void)
{
    if (start_flag == 0) // 跳变到高电平则判断是否是同步码
    {
        if ((HighCount > 40) && (HighCount < 50)) // 同步码;
        {
            start_flag = 1;
            IRNumBitCnt = 0; // 数据长度
        }
    }
    else if ((start_flag == 1) && (IRNumBitCnt < 48))
    {
        u8 i;
        static u8 j;
        i = IRNumBitCnt / 8;
        if ((HighCount >= 4) && (HighCount <= 7)) // 数据 0 560us
        {
            IR_data[i] = IR_data[i] & ~(0x80 >> j);
            IRNumBitCnt++;
            j++;
        }
        else if ((HighCount >= 15) && (HighCount <= 17)) // 数据 1 1680us
        {
            IR_data[i] = IR_data[i] | (0x80 >> j);
            IRNumBitCnt++;
            j++;
        }
        else
        {
            start_flag = 0;
            IRNumBitCnt = 0;
            j = 0;
        }
        if (j >= 8)
            j = 0;
    }
    if (IRNumBitCnt >= 48)
    {
        IR_DataAnalyze();
        start_flag = 0;
        IRNumBitCnt = 0;
    }
}

/***********************************************************
 * description: IR数据解析
 * param {*}
 * return {*}
 ***********************************************************/
void IR_DataAnalyze(void)
{
    // if (IR_DATA_8[3] == ~IR_DATA_8[2] && IR_DATA_8[1] == ~IR_DATA_8[0])
    if (IR_data[0] == 0XB2)
    {
        IR_ACCEPT_DONE_FLAG = 1;
    }
}
